﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Globalization;
using System.Web.Security;

namespace Mvc4.Models
{
    public class UsersContext : DbContext
    {
        public UsersContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<UserProfile> UserProfiles { get; set; }

        public IEnumerable<UserProfile> GetUsers()
        {
            List<UserProfile> result = new List<UserProfile>();

            foreach (var item in UserProfiles)
            {
                result.Add(item);
            }

            return result;
        }

    }

    public class RolesContext : DbContext
    {
        public RolesContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<Roles> Roles { get; set; }

        public int GetRoleId(string roleName)
        {
            
            foreach (var item in Roles)
            {
                if (item.RoleName == roleName)
                {
                    return item.RoleId;
                }
            }

            return -1;
        }

    }

    public class UsersInRolesContext : DbContext
    {
        public UsersInRolesContext()
            : base("DefaultConnection")
        {
        }

        public DbSet<UsersInRoles> UsersInRoles { get; set; }

        public IEnumerable<String> GetUsersInRole(string roleName)
        {
            List<String> result = new List<String>();
            RolesContext rolesC = new RolesContext();

            int id = rolesC.GetRoleId(roleName);

            if (id > 0)
            {
                UsersContext usersC = new UsersContext();

                foreach (var item in UsersInRoles)
                {
                    if (item.RoleId == id)
                    {
                        try
                        {
                            UserProfile user = usersC.UserProfiles.Find(item.UserId);
                            result.Add(user.UserName);
                        }
                        catch (Exception) {}
                    }
                }
            }

            return result;
        }

    }

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
    }

    [Table("webpages_Roles")]
    public class Roles
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int RoleId { get; set; }
        public string RoleName { get; set; }
    }

    [Table("webpages_UsersInRoles")]
    public class UsersInRoles
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Computed)]
        public int UserId { get; set; }
        [Key]
        [Column(Order = 1)]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Computed)]
        public int RoleId { get; set; }
    }

    public class RegisterExternalLoginModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        public string ExternalLoginData { get; set; }
    }

    public class LocalPasswordModel
    {
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Current password")]
        public string OldPassword { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "New password")]
        public string NewPassword { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm new password")]
        [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }

    public class LoginModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }

    public class RegisterModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }

    public class ExternalLogin
    {
        public string Provider { get; set; }
        public string ProviderDisplayName { get; set; }
        public string ProviderUserId { get; set; }
    }
}
